查看原文
其他

Plotly中绘制三种经典的股票交易图表(含视频讲解)

Lemon Python数据之道 2022-09-04


作者:Lemon

来源:Python数据之道


Plotly中绘制三种经典的

股票交易图表(含视频讲解)


大家好,我是 Lemon 。

背景

前一段时间, Lemon 发了一期视频,分享了 Plotly 和 Dash 在投资领域的应用案例。

点击上面图片查看视频


看完视频后,有同学提了一个问题:

股票价格曲线,带可调节的时间条的图怎么绘制?

今天 Lemon 来详细的分享下,这类图如何绘制,一共会讲解 3 类图形,分别是 面积曲线图、蜡烛图、OHLC图。这三种类型的图在投资中会经常遇到。

Lemon 录制了一个视频,来说明通过本文绘制的图表效果:

数据来源

本文的数据来自开源项目 tushare, 从 tushare 中获取数据,首先要进行注册获取 token(一串字母和数字组成的文本),然后才可以获取到数据,大家可以通过以下链接来注册(也可以点击文末的“阅读原文”):

https://tushare.pro/register?reg=129033

数据获取

tushare 中注册后,通过 “个人主页”——“接口TOKEN” 可以找到自己的 token 值,界面如下:

tushare

复制 token 值,然后在代码中进行如下设置:

# 设置 token
# tushare 注册地址:https://tushare.pro/register?reg=129033
# 以上方法只需要在第一次或者token失效后调用,完成调取tushare数据凭证的设置,正常情况下不需要重复设置。
ts.set_token('你的token值')

pro = ts.pro_api()

在设置好 token 值后,我们就可以开始获取数据,这里以获取沪深300指数为例,来演示三种类型的图形绘制。

数据获取及初步整理如下:

# plotly-fin-candlestick.ipynb
# 获取沪深300指数行情数据, asset='I', I 表示 index,即指数

# d_today = dt.date.today().strftime('%Y%m%d')

df_300 = ts.pro_bar(
    ts_code='000300.SH'
    asset='I'
    start_date='20180101'
#     end_date=d_today,
    end_date='20210119'
)

# 设置时间格式
df_300['trade_date'] = pd.to_datetime(df_300['trade_date'])
df_300 = df_300.set_index('trade_date')

df_300

面积曲线图

在常见的股票软件时,查看分时图,大部分是使用的面积曲线图,这类图形是展示股票数据常用的类型之一。

默认的面积曲线图

在 Plotly 中,可以使用 plotly express 的 area 图来绘制面积曲线图。

代码如下:

# 面积曲线图

area_chart = px.area(df_300['close'], title = '沪深300')

area_chart.update_xaxes(title_text = '日期')
area_chart.update_yaxes(
    title_text = '沪深300收盘价'
    # tickprefix = '$'
    )
area_chart.update_layout(showlegend = False)

# Pycharm,VS Code, Spider 等模式下
# Jupyter Notebook 下也可以用
# plot(area_chart,filename='tmp/hushen300-area.html')

# 在 Jupyter Notebook 中,直接使用 show()  来查看结果
area_chart.show()

绘制效果如下:

这里说明下:

  • show() 的作用是使绘制的图形在 Jupyter notebook 中显示;
  • 如果想在浏览器中使用,可以使用代码 plot(area_chart,filename='tmp/hushen300-area.html') ,该代码可以在 Jupyter notebook 、PyCharm、VS Code 等编辑器中使用。

对面积曲线图进行个性化修改

对于上面的面积曲线图,我们也可以对其进行一些个性化的修改,比如标题居中、添加可以调节的时间栏、设置y轴数值范围等。

具体代码如下:

# 面积曲线图,个性化修改

y_min = df_300['close'].min()  
y_max = df_300['close'].max()

c_area = px.area(df_300['close'], title = '沪深300')

c_area.update_xaxes(
    title_text = '日期',
    rangeslider_visible = True,
    rangeselector = dict(
        buttons = list([
            dict(count = 1, label = '1M', step = 'month', stepmode = 'backward'),
            dict(count = 6, label = '6M', step = 'month', stepmode = 'backward'),
            dict(count = 1, label = 'YTD', step = 'year', stepmode = 'todate'),
            dict(count = 1, label = '1Y', step = 'year', stepmode = 'backward'),
            dict(step = 'all')])))

c_area.update_yaxes(
    title_text = '沪深300收盘价'
    # tickprefix = '¥'
    )
c_area.update_layout(showlegend = False,
    title=dict(
        text='沪深300',
        font=dict(
            size=28,),
        x=0.5),
    yaxis=dict(range=[y_min*0.9,y_max*1.05]), # 设置 y 轴的范围
    )

# Pycharm,VS Code, Spider 等模式下
# Jupyter Notebook 下也可以用
# plot(c_area,filename='tmp/hushen300_area_update.html')

c_area.show()

上述代码的绘制效果如下:

上图中:

  • 可调节的时间栏是通过在 update_xaxes 中设置参数 rangeslider_visible = True 来实现的;
  • 左上角的时间快速选择按钮,是通过在 update_xaxes 中设置参数 rangeselector 来实现的;
  • 标题居中和y轴数值范围设置,是通过在 update_layout 中分别设置参数 'title' 和 'yaxis' 来实现的。

蜡烛图

蜡烛图又名 k线图、日本线 或者 日本K线图。

这种图表通常用作交易工具,用来显示和分析证券、衍生工具、外汇货币、股票、债券等商品随着时间的价格变动。

蜡烛图通过使用烛台式的符号来显示多种价格信息,例如开盘价、收盘价、最高价和最低价,每个代表单一时间段(每分钟、每小时、每天或每月)的交易活动。每个烛台符号沿着 X 轴上的时间刻度绘制,显示随着时间推移的交易活动。

蜡烛图的示意图如下:

默认的蜡烛图

在 Plotly 中,可以使用 candlestick 图来绘制蜡烛图。

具体代码如下:

# 蜡烛图,又称 K线 或 日本线

candlestick = go.Figure(data = [go.Candlestick(x = df_300.index, 
                                               open = df_300['open'], 
                                               high = df_300['high'], 
                                               low = df_300['low'], 
                                               close = df_300['close'])])

candlestick.update_layout(xaxis_rangeslider_visible = False, title = '沪深300')
candlestick.update_xaxes(title_text = '日期')
candlestick.update_yaxes(title_text = '沪深300价格')

# plot(candlestick,filename='tmp/hushen300_candlestick.html')

candlestick.show()

绘制效果如下:

需要说明下,上图中的颜色,对应的是红跌绿涨,跟咱们国家通常的红涨绿跌刚好是相反的。后面将提到的 OHLC 图,在 Plotly 中也是 红跌绿涨,这个习惯跟美国、香港等区域是一致的。

对蜡烛图进行个性化修改

同样的,我们可以对蜡烛图进行一些个性化的修改,同样涉及标题、可调节的时间栏、y轴数值范围等。

具体代码如下:

# 蜡烛图,个性化修改

c_candlestick = go.Figure(data = [go.Candlestick(x = df_300.index, 
                                               open = df_300['open'], 
                                               high = df_300['high'], 
                                               low = df_300['low'], 
                                               close = df_300['close'])])

c_candlestick.update_xaxes(
    title_text = '日期',
    rangeslider_visible = True,
    rangeselector = dict(
        buttons = list([
            dict(count = 1, label = '1M', step = 'month', stepmode = 'backward'),
            dict(count = 6, label = '6M', step = 'month', stepmode = 'backward'),
            dict(count = 1, label = 'YTD', step = 'year', stepmode = 'todate'),
            dict(count = 1, label = '1Y', step = 'year', stepmode = 'backward'),
            dict(step = 'all')])))

c_candlestick.update_layout(
    title = {
        'text''沪深300',
        'y':0.9,
        'x':0.5,
#         'xanchor': 'center',
#         'yanchor': 'top'
    })
c_candlestick.update_yaxes(title_text = '沪深300价格')

# plot(c_candlestick,filename='tmp/hushen300_candlestick_update1.html')

c_candlestick.show()

绘制效果如下:

各个设置参数的说明,与前面提到的面积曲线图是类似的,这里不再赘述。

对于上面这个图,有一个地方需要说明下,当我们把时间范围缩小,比如最近1个月,会发现蜡烛图是不连续的,其中有周六日和假期是跳跃的。

在绘制股票曲线时经常会遇到这类问题,我们需要绘制的图形只包含交易日,这样的图表才是符合实际情况的。因此,我们需要在 Plotly 中也实现这个功能。

可以通过在 update_xaxes 设置参数 rangebreaks 来实现,实现的代码如下:

c_candlestick.update_xaxes(
    rangebreaks=[
        dict(bounds=["sat""mon"]), # 隐藏周六、周日
        dict(values=["2021-01-01",]+holidays)  # 隐藏特定假期
    ]
)

这里需要提醒下,

  • 上面的 boundsvalues 都是list 类型;
  • values 中的元素,字符串格式为 %Y-%m-%d,比如 "2021-01-01" 。

结合标题、时间栏、y轴数值范围、隐藏节假日一起的完整代码如下:

# 蜡烛图,个性化修改,隐藏周六日以及节假日

c_candlestick = go.Figure(data = [go.Candlestick(x = df_300.index, 
                                               open = df_300['open'], 
                                               high = df_300['high'], 
                                               low = df_300['low'], 
                                               close = df_300['close'])])

c_candlestick.update_xaxes(
    title_text = '日期',
    rangeslider_visible = True,
    rangeselector = dict(
        buttons = list([
            dict(count = 1, label = '1M', step = 'month', stepmode = 'backward'),
            dict(count = 6, label = '6M', step = 'month', stepmode = 'backward'),
            dict(count = 1, label = 'YTD', step = 'year', stepmode = 'todate'),
            dict(count = 1, label = '1Y', step = 'year', stepmode = 'backward'),
            dict(step = 'all')])))

c_candlestick.update_layout(
    title = {
        'text''沪深300',
        'y':0.9,
        'x':0.5,
#         'xanchor': 'center',
#         'yanchor': 'top'
    })
c_candlestick.update_yaxes(title_text = '沪深300价格')

# 2020年国庆假期 2020.10.1-10.8
holidays = [ dt.date(2020,10,x).strftime('%Y-%m-%d'for x in range(1,9)]
print(holidays)

c_candlestick.update_xaxes(
    rangebreaks=[
        dict(bounds=["sat""mon"]), # 隐藏周六、周日
        dict(values=["2021-01-01",]+holidays)  # 隐藏特定假期
    ]
)

# plot(c_candlestick,filename='tmp/hushen300_candlestick_update2.html')

c_candlestick.show()

OHLC 图

OHLC 图 也称为「美国线」或「价格图」。

美国线 (Open-high-low-close Charts) 通常用作交易工具,显示和分析证券、货币、股票、债券等商品随时间的价格变动。OHLC 图有助于解释市场日常走势,并通过研究所形成的模式预测未来价格变化。

OHLC 图上的 Y 轴用作价格标尺,X 轴是时间刻度。在每个时段内,OHLC 图中会出现一个符号,以代表两个范围:交易的最高价和最低价,以及该时间段(例如一天)中的开盘价和收盘价。在这个范围符号上,最高和最低价的范围由主垂直线的长度所表示;而开盘和收盘价则分别在垂直线左右两边以一小段水平线代表。

示意图如下:

默认的OHLC图

在 Plotly 中,可以使用 ohlc 图来绘制蜡烛图。

具体代码如下:

# OHLC图,又称 美国线,或 价格图

ohlc = go.Figure(data = [go.Ohlc(x = df_300.index, 
                                               open = df_300['open'], 
                                               high = df_300['high'], 
                                               low = df_300['low'], 
                                               close = df_300['close'])])

ohlc.update_layout(xaxis_rangeslider_visible = False, title = '沪深300')
ohlc.update_xaxes(title_text = '日期')
ohlc.update_yaxes(title_text = '沪深300价格')

# plot(ohlc,filename='tmp/hushen300_ohlc.html')

ohlc.show()

绘制效果如下:

对OHLC图进行个性化设置

与蜡烛图类似,我们也可以进行个性化修改,具体代码如下:

# # OHLC图,个性化修改

c_ohlc = go.Figure(data = [go.Ohlc(x = df_300.index, 
                                               open = df_300['open'], 
                                               high = df_300['high'], 
                                               low = df_300['low'], 
                                               close = df_300['close'])])

c_ohlc.update_xaxes(
    title_text = '日期',
    rangeslider_visible = True,
    rangeselector = dict(
        buttons = list([
            dict(count = 1, label = '1M', step = 'month', stepmode = 'backward'),
            dict(count = 6, label = '6M', step = 'month', stepmode = 'backward'),
            dict(count = 1, label = 'YTD', step = 'year', stepmode = 'todate'),
            dict(count = 1, label = '1Y', step = 'year', stepmode = 'backward'),
            dict(step = 'all')])))

c_ohlc.update_layout(
    title = {
        'text''沪深300',
        'y':0.9,
        'x':0.5,
#         'xanchor': 'center',
#         'yanchor': 'top'
    })
c_ohlc.update_yaxes(title_text = '沪深300价格')

# 2020年国庆假期 2020.10.1-10.8
holidays = [ dt.date(2020,10,x).strftime('%Y-%m-%d'for x in range(1,9)]
print(holidays)

c_ohlc.update_xaxes(
    rangebreaks=[
        dict(bounds=["sat""mon"]), # 隐藏周六、周日
        dict(values=["2021-01-01",]+holidays)  # 隐藏特定假期
    ]
)

# plot(c_ohlc,filename='tmp/hushen300_ohlc_update.html')

c_ohlc.show()

绘制效果如下:

上面这张大图里看不出美国线的显示效果,我们可以选择今年以来的图来查看下:

本文完整的代码,请在公众号 「Python数据之道」 后台回复 Plotly 获取。

延伸阅读

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存